﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;

namespace Colonisator.Classes
{
    /// <summary>
    /// Correspond en gros au contenu de chaque case du plateau (hors position des mobiles)
    /// </summary>
    public class ElementPlateau
    {
        public Coordonnee CoordonneeElement { get; set; }
        
        /// <summary>
        /// Un élément est naviguable à partir du moment où c'est une case d'eau ou
        /// le point d'entrée d'une île
        /// </summary>
        public bool ElementNavigable { get; set; }

        /// <summary>
        /// Constructeur par défaut
        /// </summary>
        public ElementPlateau()
        {
            CoordonneeElement = new Coordonnee();
        }

        /// <summary>
        /// Construit un Element par copie d'un autre (pour éviter les pointeurs de référence ...)
        /// </summary>
        /// <param name="unElement"></param>
        public ElementPlateau(ElementPlateau unElement)
        {
            CoordonneeElement = unElement.CoordonneeElement;
            ElementNavigable = unElement.ElementNavigable;
        }

        /// <summary>
        /// Constructeur utilisé en création de partie.
        /// Les coordonnées sont générées en fonction de l'index 
        /// (remplissage de ligne avant de changer d'ordonnée)
        /// </summary>
        /// <param name="unIndexElement"></param>
        public ElementPlateau(Int32 unIndexElement)
        {
            double baseOrdonnee = unIndexElement / 100;
            Int32 ordonnee = Convert.ToInt32(Math.Floor(baseOrdonnee));
            Int32 abscisse;
            if (unIndexElement == 0)
                abscisse = unIndexElement;
            else
            {
                if (unIndexElement < 100)
                    abscisse = unIndexElement;
                else
                    Math.DivRem(100, unIndexElement, out abscisse);
            }

            CoordonneeElement = new Coordonnee(abscisse, ordonnee);
        }

        /// <summary>
        /// Retourne un nouvel ElementPlateau à parir de l'existant, auquel on applique un différentiel de déplacement
        /// </summary>
        /// <param name="uneDirection"></param>
        public ElementPlateau AppliquerDiffentiel(PointCardinal uneDirection)
        {
            return new ElementPlateau()
                {
                    CoordonneeElement = new Coordonnee(
                      this.CoordonneeElement.X + uneDirection.DifferentielDeplacementBasique.X,
                      this.CoordonneeElement.Y + uneDirection.DifferentielDeplacementBasique.Y)
                };
        }

        public override string ToString()
        {
            return "X = " + this.CoordonneeElement.X.ToString() + ", Y = " + this.CoordonneeElement.Y;
        }
    }
}
